package com.iwhalecloud.citybrain.flow.platform.manager.domain.repository;

import java.text.ParseException;
import java.util.List;

import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.FlowProcessInstanceTraceForMonitorVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.FlowProcessInstanceTraceVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.monitor.HttpProcessInstanceQueryVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.monitor.ProcessInstanceQueryVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.statistics.ProcessInstanceStatisticsQueryVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.task.FlowExecutionQueryVo;

/**
 * @author lilh
 * @date 2019-05-05 14:08
 */
public interface FlowProcessInstanceTraceRepository {

    /**
     * 新增
     *
     * @param entity 实体
     * @return 记录数
     */
    int insertProcessInstanceTrace(FlowProcessInstanceTraceVo entity);


    /**
     * 根据流程实例id获取实体
     *
     * @param processInstanceId 流程实例id
     * @return 实体
     */
    FlowProcessInstanceTraceVo getProcessInstanceTraceByProcessInstanceId(String processInstanceId);

    /**
     * 根据条件查询列表
     *
     * @param processInstanceStatisticsQueryVo 查询条件
     * @return 列表
     */
    List<FlowProcessInstanceTraceVo> getProcessInstanceTraces(ProcessInstanceStatisticsQueryVo processInstanceStatisticsQueryVo);

    /**
     * 根据条件查询列表
     *
     * @param processInstanceIsList 流程实例列表
     * @return 列表
     */
    List<FlowProcessInstanceTraceVo> getProcessInstanceTracesWithoutUserCheck(List<String> processInstanceIsList);


    /**
     * 实例监控列表
     *
     * @param processInstanceQueryVo 查询条件
     * @return 列表
     * @throws ParseException 日期解析失败
     */
    List<FlowProcessInstanceTraceForMonitorVo> list(ProcessInstanceQueryVo processInstanceQueryVo) throws ParseException;

    /**
     * 提供外部调用，我的申请单列表
     *
     * @param processInstanceQueryVo 查询参数
     * @return 申请单列表
     */
    List<FlowProcessInstanceTraceVo> list(HttpProcessInstanceQueryVo processInstanceQueryVo);


    /**
     * 更新实例状态
     *
     * @param processInstanceTraces 实例信息
     */
    void update(List<FlowProcessInstanceTraceVo> processInstanceTraces);

    /**
     * 更新实例
     *
     * @param processInstanceTrace 实例信息
     */
    void update(FlowProcessInstanceTraceVo processInstanceTrace);

    /**
     * 将状态更新为运行中
     *
     * @param processInstanceId 实例id
     */
    void updateLinkStatusToRunning(String processInstanceId);

    /**
     * 将状态更新为结束
     *
     * @param processInstanceId 实例id
     */
    void updateLinkStatusToEnd(String processInstanceId);

    /**
     * 将状态更新为超时
     *
     * @param processInstanceId 实例id
     */
    void updateStatusToTimeout(String processInstanceId);

    /**
     * 将状态更新为预警
     *
     * @param processInstanceId 实例id
     */
    void updateStatusToWarning(String processInstanceId);

    void updateStatusToError(String processInstanceId);

    /**
     * 更新状态
     *
     * @param processInstanceId 实例id
     * @param status            状态
     */
    void updateStatus(String processInstanceId, String status);

    /**
     * 取消流程
     *
     * @param processInstanceId 流程实例
     */
    void cancelProcessInstance(String processInstanceId);

    /**
     * 更新流程模板信息
     *
     * @param processInstanceId 实例id
     * @param newProcDefId 新流程模板信息
     */
    void updateProcDefId(String processInstanceId,String newProcDefId,Integer version);

    String queryFlowStateByFlowId(String flowId);
}
